package com.atguigu.single.cicle;

import com.atguigu.single.Node;

/**
 * @ClassName SingelCicleLinkList
 * @DeScription 单向环形链表
 * @Author 剧情再美终是戏
 * @Date 2019/11/22 9:38
 * @Version 1.0
 **/
public class SingelCicleLinkList {

    // 初始化，头节点形成环形链表
    static Node head = null;
    static {
        head = new Node(0, "", "");
        head.setNext(head);
    }


    // 添加
    public void add(Node node) {

        // 辅助节点
        Node tmp = head;


        // 先找到尾部节点
        while (head != tmp.getNext()) {
            tmp = tmp.getNext();
        }

        // 将尾部节点指定当前新添加的节点
        tmp.setNext(node);

        // 将当前节点指向头节点，形成环形链表
        node.setNext(head);
    }

    // 有序添加
    public void addByOrder(Node node) {

        // 辅助节点
        Node tmp = head;

        // 先找合适的位置
        for (; ; ) {
            if (tmp.getNext().getId() > node.getId()) {
                break;
            }
            if (head == tmp.getNext()) {
                break;
            }
            tmp = tmp.getNext();
        }

        // 先将node指向tmp.next
        node.setNext(tmp.getNext());

        // 再将tmp.next指定node
        tmp.setNext(node);
    }

    // 修改
    public void update(Node node) {

        // 辅助节点
        Node tmp = head;

        // 先找合适的位置
        while (head != tmp.getNext()) {
            if (tmp.getId() == node.getId()) {
                break;
            }
            tmp = tmp.getNext();
        }

        // 修改节点的信息
        tmp.setName(node.getName());
        tmp.setDes(node.getDes());
    }

    // 删除
    public void del(int id) {

        // 辅助节点
        Node tmp = head;

        // 先找合适的位置,将记录上一个节点
        boolean flag = false;
        Node next = null;
        for (; ; ) {
            // 循环完了，没有找到退出
            if (head == tmp.getNext()) {
                break;
            }

            // 找到当前节点，记录下一个节点,并将标记设置为true
            if (id == tmp.getNext().getId()) {
                flag = true;
                next = tmp.getNext().getNext();
                break;
            }
            tmp = tmp.getNext();
        }

        if (flag) {
            // 将tmp节点指定next节点
            tmp.setNext(next);
        } else {
            System.out.println("没有找到匹配的节点，删除失败");
        }
    }

    // 显示
    public void show() {

        // 如果为空就返回
        if (null == head) {
            System.out.println("队列为空了");
            return;
        }

        // 辅助节点
        Node tmp = head.getNext();

        while (head != tmp) {
            System.out.println(tmp);
            tmp = tmp.getNext();
        }
    }
}
